[프로그래머스] 여행경로 Success

주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 'ICN' 공항에서 출발합니다.

Posted by ChaelinJ on June 04, 2021

문제 설명

주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 “ICN” 공항에서 출발합니다.

항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 모든 공항은 알파벳 대문자 3글자로 이루어집니다.
  • 주어진 공항 수는 3개 이상 10,000개 이하입니다.
  • tickets의 각 행 [a, b]는 a 공항에서 b 공항으로 가는 항공권이 있다는 의미입니다.
  • 주어진 항공권은 모두 사용해야 합니다.
  • 만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return 합니다.
  • 모든 도시를 방문할 수 없는 경우는 주어지지 않습니다.

입출력 예

tickets return
[[“ICN”, “JFK”], [“HND”, “IAD”], [“JFK”, “HND”]] [“ICN”, “JFK”, “HND”, “IAD”]
[[“ICN”, “SFO”], [“ICN”, “ATL”], [“SFO”, “ATL”], [“ATL”, “ICN”], [“ATL”,”SFO”]] [“ICN”, “ATL”, “ICN”, “SFO”, “ATL”, “SFO”]

접근

  • DFS

저는 공항과 티켓을 클래스로 생성해서 해결했습니다.

따로 클래스를 생성하지 않고 해결하시는 분들도 많으시더라구요! 저도 그 방법으로 다시 풀어보긴 했지만 먼저 사용했던 방법이 뭔가 정점 - 간선의 관계를 객체지향으로 잘 표현한 것 같아 제 입장에선 이해가 더 쉬웠던 거 같아요!

그래서 전 클래스를 생성해 해결한 방법을 포스팅했습니다.

Airport - Vertex

  • inciList: 해당 공항을 시작점으로 하는 티켓 객체를 저장할 수 있도록 ArrayList 필드를 포함합니다.
  • sortInciAp(): 저장된 티켓의 개수가 2개 이상이면 티켓들을 정렬하는 메소드 입니다.

Ticket - Edge

  • Airport s, e: 티켓의 출발 공항과 도착 공항
  • boolean flag: 해당 티켓이 사용되었는지 아닌지를 나타내는 값
  • compareTo: 알바벳 순서로 정렬하기 위해 Comparable을 구현해 오버라이드한 메소드 - 기준은 도착 공항의 코드(공항 이름)

알파벳 순서로 정렬

우선 알파벳 순서로 정렬하는 과정은 두 가지 타이밍이 있습니다.

  • DFS 수행 전, 각 출발 지정 공항의 티켓들을 정렬
  • DFS 수행 후, 모든 경로를 찾아 정렬

저는 첫 번째 타이밍에 정렬을 수행했습니다. 이 경우 DFS를 돌며 최종적으로 나온 루트가 자동적으로 정렬된 루트가 되며 여러 개의 루트를 저장할 필요 없이, 최초로 생성된 루트를 채택하면 됩니다.

두 번째 방법으로 정렬하는 것은 가짓수가 적어질 수 있어 더 효율적일 수 있으나 모든 루트를 저장 후, 마지막에 정렬해야 해서 루트를 저장하는 자료형에 있어 한정적일 수 있습니다.

Solution

DFS를 수행하며 여행 경로대로 저장된 String 배열을 리턴합니다.

Method Return Description
solution(String[][] tickets) String[] 최초 티켓 정보를 입력 받아 여행 경로를 담은 String 배열을 반환
DFS(int N, Airport begin) String[] 티켓 개수(N)와 출발지점을 입력 받아 rDFS를 호출합니다.
rDFS(int N, int cnt, Airport begin, String[] visited) int DFS를 수행하는 재귀 함수로, 입력 받은 visited 배열에 저장합니다.

rDFS의 cnt는 저장된 여행지 개수이며, 모든 티켓을 사용하면 N+1이 됩니다. cnt 값을 유지하기 위해 cnt 값을 return해 줍니다.

결과

사용 연어: Java

테스트 메모리 시간
1 53.1 MB 0.80 ms
2 52.3 MB 0.66 ms
3 52.2 MB 0.45 ms
4 53.6 MB 0.46 ms

감사합니다.

Text by Chaelin. Photographs by Chaelin, Unsplash.